//
//  WBNetworkManager.swift
//  weibo
//
//  Created by 林帆 on 2017/4/12.
//  Copyright © 2017年 林帆. All rights reserved.
//

import UIKit
import AFNetworking

/// Swift 的枚举支持任意数据类型
/// switch / enum 在 OC 中都只是支持整数
enum WBHTTPMethod {
    case GET
    case POST
}

class WBNetworkManager: AFHTTPSessionManager {

    // (单例) 静态区/常量/闭包
     // 在第一次访问时，执行闭包，并且将闭包
//    static let shared = WBNetworkManager()

    static let shared : WBNetworkManager = {
        
        let instance = WBNetworkManager()
        
        instance.responseSerializer.acceptableContentTypes?.insert("text/plain")
        
        return instance
    }()
    
    //访问令牌， 所有网络请求都基于此令牌（登录除外）
    
    //为了保证安全 token是有时限的，默认用户三天
    var accessToken : String?  = "2.00f5gt9D0OJGA5f7232084c76OonXD"
    
    var uid : String? = "1404376560"
    
    var userLogin : Bool {
        return accessToken != nil
    }
    
    /// 专门负责拼接 token 的网络请求方法
    func tokenRequest (method : WBHTTPMethod = .GET, URLString: String, parameters: [String: AnyObject]?, completion :  @escaping (  _ json : Any?,  _ isSuccess : Bool) -> ( )) {
        
        // 处理 token 字典
        // 判断 token是否为nil
        guard let token = accessToken else {
            completion(nil, false)
            return
        }
        
        //1> 判断 参数字典是否存在，如果为 nil ， 应该新建一个字典 我们来聊点有意义的吧~
        var parameters = parameters
        if parameters == nil {
            //实例化字典
            parameters = [String : AnyObject]()
        }
        
        //设置参数字典
        parameters!["access_token"] = token as AnyObject
        
        // 调用 request 发起真正的网络请求方法
        request(URLString: URLString, parameters: parameters!, completion: completion)
    }
    
    // get / post  请求
    /// - parameter method : get / post
    /// - parameter URLString : URLString  不是应该
    /// - parameter parameters : 参数字典 
    /// - parameter completion : 完成回调 [json(字典/数组)]
    func request(method : WBHTTPMethod = .GET, URLString: String, parameters: [String: AnyObject], completion :  @escaping ( _ json : Any?, _ isSuccess : Bool) -> ( )) {
        
        //成功回调
        let success = { ( task : URLSessionDataTask, json : Any?) -> ( ) in
            completion(json, true)
        }
        //失败回调
        let failure = { ( task : URLSessionDataTask?, error : Any) -> ( ) in
           if (task?.response as? HTTPURLResponse)?.statusCode == 403 {
                print("token 过期啦")
            
            // FIXME: 发送通知 (本方法不知道被谁调用, 谁接受到通知，谁处理！)
            }
            print("网络请求错误 \(error)")
            completion(nil , false)
        }
        
        if method == .GET {
            get(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        } else {
            post(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        }
    }
}
 
